home *** CD-ROM | disk | FTP | other *** search
RISC OS BBC BASIC V Source | 1994-09-26 | 22.7 KB | 577 lines |
- >InfoBar:0_04
- Display time/date/free memory/mode simple readout
- David G Jones, 1994
- This software is PD, do what you will with it.
- $; " (Error code ";
- ); ")":
- SReplaceResource% =
- :
- Whether we create our own smaller ResourceFiler icon
- MStopWelcome% =
- :
- Stop Welcome screen on starting up the desktop
- 1prog$ = "InfoBar": vers$="0.04 (25 Sep 1994)"
- Start & Finish external coordinates of the various displays. Order of displays is
- important within the rloop section
- (DateX0% = 0 * 16: DateX1% = 7 * 16
- (TimeX0% = 8 * 16: TimeX1% = 14 * 16
- (ModeX0% = 15 * 16: ModeX1% = 18 * 16
- (FreeX0% = 19 * 16: FreeX1% = 26 * 16
- command$="Desktop_"+prog$
- bl$ =
- cr$ =
- nl% = &0A0D
- "Service_Reset = &27
- "Service_StartWimp = &49
- "Service_StartedWimp = &4A
- "Service_MemoryMoved = &4E
- "Service_DesktopWelcome = &7C
- assembly
- "OS_File", 10, prog$, &FFA,, code, O%
- assembly
- code 16383
- pass% = 4
- O% = code: P% = 0
- [ OPT pass%
- (! equd start
- equd 0
- *! equd final
- +' equd serviceCall
- ,' equd titleString
- -& equd helpString
- .$ equd keyWords
- equd 0
- equd 0
- equd 0
- equd 0
- 4-.titleString equs prog$ +bl$: align
- 5O.helpString equs prog$+
- (9)+vers$+" David G Jones"+bl$: align
- .keyWords
- 80.startUpName equs command$ +bl$: align
- 9' equd startUpComm
- equd 0
- ;' equd startUpHelp
- <' equd startUpHelp
- .keyWords_end equd 0
- .startUpHelp equs "InfoBar displays a row of useful readouts along the top left of the icon bar; Date, time, mode and free memory.": equw nl%
- @T equs "Do not use *"+command$+", use *Desktop instead.": equw nl%
- A4 equs "Syntax: *"+command$+bl$
- align
- D2.serviceCall teq r1, #Service_StartWimp
- E4 teqNE r1, #Service_StartedWimp
- F. teqNE r1, #Service_Reset
- G4 teqNE r1, #Service_MemoryMoved
- StopWelcome%: [OPT pass%: teqNE r1, #Service_DesktopWelcome:]
- I#[ OPT pass%: movNES pc, r14
- K2 teq r1, #Service_StartWimp
- L% bEQ startWimp
- M4 teq r1, #Service_StartedWimp
- N' bEQ startedWimp
- O. teq r1, #Service_Reset
- P( bEQ serviceReset
- Q4 teq r1, #Service_MemoryMoved
- R( strEQ r1, PollWord
- StopWelcome%:[OPT pass%:teq r1, #Service_DesktopWelcome:]:
- T"[ OPTpass%: movEQ r1, #0
- V# movS pc, r14
- X+.startWimp ldr r12, taskHandle
- Y# teq r12, #0
- Z# mvnEQ r12, #0
- [+ strEQ r12, taskHandle
- \+ adrEQ r0, startUpName
- ]" movEQ r1, #0
- ^# movS pc, r14
- `+.startedWimp ldr r12, taskHandle
- a# cmn r12, #1
- b# movEQ r12, #0
- c+ strEQ r12, taskHandle
- d# movS pc, r14
- f#.serviceReset mov r12, #0
- g+ str r12, taskHandle
- h# movS pc, r14
- j..startUpComm stmfd r13!, {r0-r2, r14}
- k" mov r2, r0
- l" mov r0, #3
- m/ swi "XWimp_ReadSysInfo"
- n/ ldmVSfd r13!, {r0 - r2, pc}
- o" teq r0, #0
- p, adrEQ r0, notInDesktop
- q. swiEQ "OS_GenerateError"
- r+ adr r1, titleString
- s" mov r0, #2
- t( swi "XOS_Module"
- u- ldmfd r13!, {r0-r2, pc}
- .notInDesktop equd 0
- x> equs "Use *Desktop to start "+prog$+bl$
- align
- .taskHandle equd 0
- }'.wimpError ldr r1, PollMask
- ~O tst r1, #1 << 31 ; Are we still in wimp init?
- $ movEQ r1, #%011
- $ movNE r1, #%010
- ' adr r2, TaskName
- - swi "Wimp_ReportError"
- ! teq r1, #1
- # bEQ continue
- $ b closeDown
- L.NoTemplate equd 0: equs "Could not find window template" +bl$: align
- :.TemplatesFN equs "InfoBar:Templates" +bl$: align
- 1.Grabkeys equs "grabkeys" +bl$: align
- 1.TaskName equs "Info Bar" +bl$: align
- P.Messages equd &400c1: equd &400c2: equd &400c3: equd &400c4: equd 0
- W.PollMask equd %0010000000001100001110000
- (1 << 31) ;mark not set up yet
- .PollWord equd 0
- P.start mov r0, #256 ; Minimum version 3.10
- - add r0, r0, #310 - 256
- # ldr r1, TASK
- ' adr r2, TaskName
- ' adr r3, Messages
- - swi "XWimp_Initialise"
- $ bVS wimpError
- ) str r1, taskHandle
- * adr r1, TemplatesFN
- / swi "XWimp_OpenTemplate"
- $ bVS wimpError
- *
- adrl("", 1, WimpBlock)
- ' add r2, r1, #128
- % add r3, r2, #0
- ! mvn r4, #0
- ' adr r5, Grabkeys
- ! mov r6, #0
- / swi "XWimp_LoadTemplate"
- $ bVS wimpError
- ! teq r6, #0
- ) adrEQ r0, NoTemplate
- $ bEQ wimpError
- & mvn r2, #&10000
- ' str r2, [r1, #0]
- ( add r2, r2, #&100
- ' str r2, [r1, #8]
- / swi "XWimp_CreateWindow"
- ' strVC r0, [r1, #0]
- 1 swiVC "XWimp_GetWindowState"
- - swiVC "XWimp_OpenWindow"
- $ bVS wimpError
- ' add r2, r1, #128
- % add r3, r2, #0
- K mvn r4, #0 ; No font support
- * adr r5, titleString
- Z mov r6, #0 ; First search for template name
- / swi "XWimp_LoadTemplate"
- $ bVS wimpError
- S teq r6, #0 ; Was the template found?
- L adrEQ r0, NoTemplate ; >No So complain
- ; bEQ wimpError ;
- / swiVC "XWimp_CreateWindow"
- , strVC r0, InfoBarHandle
- Q movVC r2, r0 ; r2 == info bar handle
- R mvnVC r0, #1 ; icon bar window handle
- ' strVC r0, [r1, #0]
- 1 swiVC "XWimp_GetWindowState"
- V add r4, r1, #4 ; r4 => visible area details
- W ldmia r4, {r5 - r8} ; r5 == min x ... r8 == max y
- Q ldrVC r3, [r1, #28] ; r3 == icon bar behind
- S strVC r2, [r1, #0] ; Ok get info bar details
- 1 swiVC "XWimp_GetWindowState"
- G addVC r7, r5, # FreeX1% ; r7 == max x
- H mvnVC r0, #0 ; Current mode
- F movVC r1, #5 ; YEigFactor
- 1 swiVC "XOS_ReadModeVariable"
- W movVC r0, #1 ; vertical space around chars
- ) movVC r0, r0, LSL r2
- W addVC r0, r0, #32 ; Static height of characters
- G subVC r6, r8, r0 ; r6 == min y
- V stmIA r4, {r5 - r8} ; store visible area details
- K subVC r1, r4, #4 ; r1 => WimpBlock
- O strVC r3, [r1, #28] ; open above icon bar
- - swiVC "XWimp_OpenWindow"
- $ bVS wimpError
- 0 swi "XWimp_CloseTemplate"
- $ bVS wimpError
- ReplaceResource%
- [ OPT pass%
- ) mov r0, #&50000000
- ,
- adrl("", 1, RomAppsIcon)
- - swi "XWimp_CreateIcon"
- $ bVS wimpError
- [ OPT pass%
- ' ldr r0, PollMask
- S bic r0, r0, #1 << 31 ;Finished wimp init, so GO Go Go
- ' str r0, PollMask
- '.continue
- adrl("", 13, Stack)
- $ b updateAll
- ".wimpPoll mov r0, #14
- ( adr r1, WimpBlock
- ! mov r2, #3
- ' str r2, [r1, #0]
- % swi "XOS_Word"
- ! mvnVC r0, #0
- % addVC r2, r1, #8
- = swiVC "XTerritory_ConvertTimeToOrdinals"
- ' ldrVC r1, [r2, #4]
- & rsbVC r1, r1, #60
- 2 swiVC "XOS_ReadMonotonicTime"
- $ bVS wimpError
- 8 add r1, r1, r1, LSL #2 ;(r1 * 5
- < add r1, r1, r1, LSL #2 ; * 5
- W add r2, r0, r1, LSL #2 ; * 4) + r0 == r1 * 100 + r0
- ' ldr r0, PollMask
- ( adr r1, WimpBlock
- ' adr r3, PollWord
- + swi "XWimp_PollIdle"
- $ bVS wimpError
- ! cmp r0, #1
- L bLT updateTime ; Null_Reason_Code
- / swiEQ "XWimp_RedrawWindow"
- $ bVS wimpError
- bEQ rloop
- H teq r0, #17 ; User_Message
- Q teqNE r0, #18 ; User_Message_Recorded
- ) bEQ receiveMessage
- N teq r0, #13 ; Poll word non-zero
- # bEQ pollWord
- G teq r0, #8 ; Key_Pressed
- # bEQ keypress
- ReplaceResource%
- G[ OPT pass%: teq r0, #6 ; Mouse_Click
- ) bEQ mouseclick :]
- [ OPT pass%
- # b wimpPoll
- X.keypress ldr r0, [r1, #24] ; r0 == character code pressed
- K teq r0, #&1DC ; Is it Shift-F12
- Z strEQ r0, PollWord ; >Yes Mark infobar to be opened
- Q swi "XWimp_ProcessKey" ; Pass on character key
- # bVC wimpPoll
- $ b wimpError
- M.pollWord ldr r2, PollWord ; r2 == poll reason
- ! mov r3, #0
- K str r3, PollWord ; clear poll word
- 3 teq r2, #Service_MemoryMoved
- % bEQ updateFree
- W; Icon bar has changed position in window heap so reopen our window infront of ibar
- !R mvn r0, #1 ; icon bar window handle
- "' str r0, [r1, #0]
- #1 swi "XWimp_GetWindowState"
- $( ldrVC r2, [r1, #28]
- %, ldrVC r0, InfoBarHandle
- &' strVC r0, [r1, #0]
- '1 swiVC "XWimp_GetWindowState"
- (( strVC r2, [r1, #28]
- )- swiVC "XWimp_OpenWindow"
- *# bVC wimpPoll
- +$ b wimpError
- -'.updateTime bL readTimeDate
- .T ldr r0, Date ; Load current date string
- /U ldr r1, DateOldWord ; Load previous date string
- 0Q teq r0, r1 ; Has the date changed?
- 1O strNE r0, DateOldWord ; >Yes Store new date
- 2Z movNE r2, #DateX0% ; Set min X to Date section
- 3Z movEQ r2, #TimeX0% ; >No Set min X to Time section
- 4' mov r4, #TimeX1%
- 5' b updateWindow
- 7&.updateFree ldr r7, FreeOld
- 8# bL readFree
- 9& ldr r0, FreeOld
- :! teq r0, r7
- ;# bEQ wimpPoll
- <' mov r2, #FreeX0%
- =' mov r4, #FreeX1%
- >' b updateWindow
- @'.updateAll bL readTimeDate
- A# bL readMode
- B# bL readFree
- C' mov r2, #DateX0%
- D' mov r4, #FreeX1%
- E' b updateWindow
- ; Read both time & date
- H(.readTimeDate adr r1, WimpBlock
- I" mov r0, #14
- J! mov r2, #3
- K' str r2, [r1, #0]
- L% swi "XOS_Word"
- M$ bVS wimpError
- O1; calculate time from stored 5-byte real time
- P(.readTimeDate0 adr r0, WimpBlock
- Q# adr r1, Time
- R! mov r2, #8
- S) adr r3, TimeFormat
- T3 swi "XOS_ConvertDateAndTime"
- U$ bVS wimpError
- V% sub r2, r1, r0
- WU ldrB r1, [r0] ; Clear pre-"0" if it is there
- X' teq r1, #
- ("0")
- Y% subEQ r2, r2, #1
- Z) str r2, TimeLength
- [( bNE readTimeDate1
- \'.loop ldrB r1, [r0, #1]
- ]' strB r1, [r0], #1
- ^% subS r2, r2, #1
- bGT loop
- a1; calculate date from stored 5-byte real time
- b(.readTimeDate1 adr r0, WimpBlock
- c# adr r1, Date
- d! mov r2, #8
- e) adr r3, DateFormat
- f3 swi "XOS_ConvertDateAndTime"
- g$ bVS wimpError
- h% sub r2, r1, r0
- iV ldrB r1, [r0] ; Clear pre-"0" if it is there
- j' teq r1, #
- ("0")
- k% subEQ r2, r2, #1
- l) str r2, DateLength
- m" movNES pc, r14
- n'.loop ldrB r1, [r0, #1]
- o' strB r1, [r0], #1
- p% subS r2, r2, #1
- bGT loop
- s" movS pc, r14
- u!.readMode mvn r0, #0
- v! mov r1, #5
- w1 swi "XOS_ReadModeVariable"
- x) str r2, YEigFactor
- y! mov r0, #1
- z. swi "XWimp_ReadSysInfo"
- {# adrVC r1, Mode
- |! movVC r2, #8
- }1 swiVC "XOS_ConvertCardinal1"
- ~% subVC r1, r1, r0
- ) strVC r1, ModeLength
- " movVCS pc, r14
- $ b wimpError
- !.readFree mvn r0, #0
- ! mvn r1, #0
- + swi "XWimp_SlotSize"
- ! movVC r0, r2
- & strVC r0, FreeOld
- # adrVC r1, Free
- " movVC r2, #12
- 0 swiVC "XOS_ConvertFileSize"
- $ bVS wimpError
- ! mov r2, #0
- '.loop ldrB r1, [r0], #1
- " cmp r1, #32
- ' bLT readfree_end
- " cmp r1, #80
- % addLE r2, r2, #1
- bLE loop
- ).readfree_end str r2, FreeLength
- " movS pc, r14
- .receiveMessage
- ( ldr r2, [r1, #16]
- * sub r3, r2, #&40000
- # cmp r3, #&c1
- # bLEQ readMode
- # bEQ wimpPoll
- # teq r3, #&C2
- # teqNE r3, #&C3
- # teqNE r3, #&C4
- % bEQ updateFree
- ! teq r2, #0
- # bNE wimpPoll
- ).closeDown ldr r0, taskHandle
- # ldr r1, TASK
- , swi "XWimp_CloseDown"
- ! mov r0, #0
- ) str r0, taskHandle
- ,
- adrl("", 3, titleString)
- * swi "OS_ExitAndDie"
- &.final stmFD r13!, {r14}
- ) ldr r0, taskHandle
- ! teq r0, #0
- # ldrGT r1, TASK
- , swiGT "XWimp_CloseDown"
- ! mov r1, #0
- ) str r1, taskHandle
- % ldmFD r13!, {pc}
- !.TASK equs "TASK"
- #.Date
- defineMemory(8)
- .DateOldWord equd 0
- .DateLength equd 0
- 0.DateFormat equs "%DY %M3" +bl$: align
- #.Time
- defineMemory(8)
- .TimeLength equd 0
- 0.TimeFormat equs "%12:%MI" +bl$: align
- #.Mode
- defineMemory(8)
- .ModeLength equd 0
- $.Free
- defineMemory(12)
- .FreeLength equd 0
- .FreeOld equd -1
- .InfoBarHandle equd 0
- &.WimpBlock
- defineMemory(256)
- .Stack
- .YEigFactor equd 2
- ; r2 = start x ;r4 = end x
- (.updateWindow adr r1, WimpBlock
- , ldr r0, InfoBarHandle
- " mvn r3, #63
- ! mov r5, #0
- , stmIA r1, {r0, r2 - r5}
- / swi "XWimp_UpdateWindow"
- $ bVS wimpError
- !.rloop teq r0, #0
- # bEQ wimpPoll
- -.rloop_start ldr r8, WimpBlock + 4
- - ldr r9, WimpBlock + 16
- * ldr r10, YEigFactor
- - ldr r1, WimpBlock + 28
- - ldr r7, WimpBlock + 36
- ' cmp r1, #FreeX0%
- ! bGE rloop4
- ' cmp r1, #ModeX0%
- ! bGE rloop3
- ' cmp r1, #TimeX0%
- ! bGE rloop2
- 0 ; Draw out the date component
- ,.rloop1 mov r3, #DateX0%
- 1 mov r4, #DateX1% - DateX0%
- # adr r5, Date
- ) ldr r6, DateLength
- bL draw
- ' cmp r7, #TimeX0%
- $ bLT rloop_end
- 0 ; draw out the time component
- $.rloop2 mov r3, #TimeX0%
- . mov r4, #TimeX1% - TimeX0%
- adr r5, Time
- & ldr r6, TimeLength
- bL draw
- ' cmp r7, #ModeX0%
- $ bLT rloop_end
- ; Mode
- $.rloop3 mov r3, #ModeX0%
- . mov r4, #ModeX1% - ModeX0%
- adr r5, Mode
- & ldr r6, ModeLength
- bL draw
- ' cmp r7, #FreeX0%
- $ bLT rloop_end
- ; Free memory
- $.rloop4 mov r3, #FreeX0%
- . mov r4, #FreeX1% - FreeX0%
- adr r5, Free
- & ldr r6, FreeLength
- bL draw
- (.rloop_end adr r1, WimpBlock
- / swi "XWimp_GetRectangle"
- $ bVS wimpError
- ! teq r0, #0
- & bNE rloop_start
- # b wimpPoll
- C; r3 - start x; r4 - width; r5 - ptr to string; r6 - string len
- !.draw mov r0, #2
- , swi "XWimp_SetColour"
- ! movVC r0, #4
- % addVC r1, r8, r3
- ! movVC r2, r9
- % swiVC "XOS_Plot"
- & movVC r0, #96 + 1
- ! movVC r1, r4
- ' mvnVC r2, #31 + 16
- % swiVC "XOS_Plot"
- - subVC r1, r4, r6, LSL #4
- - addVC r1, r3, r1, ASR #1
- % addVC r1, r1, r8
- ! movVC r2, #2
- * movVC r2, r2, LSL r10
- % subVC r2, r9, r2
- !! movVC r0, #4
- "% swiVC "XOS_Plot"
- #! movVC r0, #7
- $, swiVC "XWimp_SetColour"
- %! movVC r0, r5
- &! movVC r1, r6
- '' swiVC "XOS_WriteN"
- (" movVCS pc, r14
- )$ b rloop_end
- ReplaceResource%
- [OPT pass%
- -D; Replacement ResourceFiler icon (because it is too high on bar)
- .'.mouseclick ldr r2, [r1, #8]
- /$ teq r2, #%100
- 0( adrEQ r0, Resources
- 1$ swiEQ "XOS_CLI"
- 2$ bVS wimpError
- 3$ teq r2, #%001
- 4) adrEQ r0, Resources1
- 5$ swiEQ "XOS_CLI"
- 6# bVC wimpPoll
- 7$ b wimpError
- 9G.Resources equs "Filer_OpenDir Resources:$.Apps" +bl$: align
- :G.Resources1 equs "Filer_OpenDir Resources:$" +bl$: align
- .RomAppsIcon equd -5
- <2 equd 0: equd 0: equd 68: equd 68
- =B equd &1700203A:
- equsPadWithTo("romapps", 0, 12)
- [ OPT pass%
- pass%
- defineMemory(A%)
- fill(0, A%)
- equsPadWithTo(string$, pad%, length%)
- This stores the string$. Ensuring it is pad% terminated, and altogether
- takes length% bytes. (Pads all with pad%)
- short$, temp$
- N#short$ =
- string$, length% - 1)
- O"[ OPT pass%: equs short$: ]
- P,temp$ =
- fill(pad%, length% -
- (short$))
- fill(byte, count)
- This fills in count bytes with the value in byte
- loop
- count <= 0
- "Assigning zero space here!": =0
- loop = 1
- count
- Z! [ OPT pass%: equb byte: ]
- loop
- [ OPT pass%: ALIGN: ]
- adrl(c$,r%,addr%)
- c%,df%,byte_lo%,byte_hi%,opcode1%,opcode2%
- addr%=P%
- (pass%
- 12)=0
- P%+=8:O%+=8:=0
- (addr%-P%)<256
- error("ADRL failed: Address within range when setting R"+
- r%+" to "+
- addr%,-1)
- (addr%-P%)>65535
- error("ADRL failed: Address outside range when setting R"+
- r%+" to "+
- addr%,-1)
- c$=" "
- c$="" c$="AL"
- e.c%=
- "EQNECSCCMIPLVSVCHILSGELTGTLEALNV",c$)
- c%=0
- error("ADRL failed: ARM condition code not recognized when setting R"+
- r%+" to "+
- addr%,-1)
- c%=(c%-1)
- df%=addr%-P%-8
- byte_lo%=
- (df%)
- byte_hi%=
- (df%)
- &FF00
- df%>=0
- k3 opcode1%=(c%<<28)+&028F0000+(r%<<12)+byte_lo%
- lA opcode2%=(c%<<28)+&02800C00+(r%<<16)+(r%<<12)+(byte_hi%>>8)
- n3 opcode1%=(c%<<28)+&024F0000+(r%<<12)+byte_lo%
- oA opcode2%=(c%<<28)+&02400C00+(r%<<16)+(r%<<12)+(byte_hi%>>8)
- q,[OPT pass%:EQUD opcode1%:EQUD opcode2%:]
-